package com.itheima.cglib;


import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

/*
* 模拟一个消费者
* */
public class Client {
    public static void main(String[] args) {

        //被代理的对象 必须是final
        final Producer producer = new Producer();
        //.     producer.saleProduct(1000f);

        /*
         * 动态代理
         * 不修改源码的情况下 对方法进行增强
         * 分类:
         * 基于子类的动态代理     第三方cglib库  需要导入依赖

         *
         * 如何创建代理对象:
         * 使用Enhancer类中的create方法
         * 创建代理类的要求:
         * 被代理类不能是最终类         要求：被代理类不能是final的，因为代理对象会是它的子类
         * 被代理类至少实现一个接口
         *
         *
         * */

      Producer pro=(Producer) Enhancer.create(producer.getClass(), new MethodInterceptor() {
            /**
             * 执行代理对象的任何方法都会经过该方法
             * @param o
             * @param method
             * @param objects
             * @param methodProxy
             * @return
             * @throws Throwable
             */
            public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
                Object returnValue=null;

                //获取被代理对象的参数
                Float money = (Float) objects[0];
                if("saleProduct".equals(method.getName())){
                    //提供增强的代码
                    returnValue= method.invoke(producer,money*0.8f);
                }
                return returnValue;
            }
        });

      pro.saleProduct(12000f);

    }
}